package com.example.onlineanswer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.onlineanswer.model.entity.Answer;
import com.example.onlineanswer.model.vo.AnswerStatisticsVO;
import com.example.onlineanswer.model.vo.UserAnswerVO;

import java.util.List;

/**
 * 答题服务接口
 */
public interface AnswerService extends IService<Answer> {

    /**
     * 用户答题
     *
     * @param answer 答题信息
     * @return 是否成功
     */
    boolean submitAnswer(Answer answer);

    /**
     * 获取用户在某场竞赛中的答题记录
     *
     * @param userId    用户ID
     * @param contestId 竞赛ID
     * @return 答题记录列表
     */
    List<UserAnswerVO> getUserAnswersByContestId(Long userId, Long contestId);

    /**
     * 查询指定竞赛的所有答题记录（分页）
     *
     * @param page      分页参数
     * @param contestId 竞赛ID
     * @param questionId 题目ID（可选）
     * @param userId    用户ID（可选）
     * @param isCorrect 是否正确（可选）
     * @return 答题记录列表
     */
    IPage<UserAnswerVO> pageContestAnswers(Page<UserAnswerVO> page, Long contestId, Long questionId, Long userId, Boolean isCorrect);

    /**
     * 获取题目的答题统计
     *
     * @param contestId  竞赛ID
     * @param questionId 题目ID
     * @return 答题统计信息
     */
    AnswerStatisticsVO getQuestionAnswerStatistics(Long contestId, Long questionId);

    /**
     * 检查用户是否已回答过指定题目
     *
     * @param userId    用户ID
     * @param participationId 参赛记录ID
     * @param questionId 题目ID
     * @return 是否已回答
     */
    boolean hasUserAnswered(Long userId, Long participationId, Long questionId);

    /**
     * 更新答题状态
     *
     * @param id     答题ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateAnswerStatus(Long id, Integer status);

    /**
     * 统计用户在竞赛中的正确答题数
     *
     * @param userId    用户ID
     * @param contestId 竞赛ID
     * @return 正确数量
     */
    int countUserCorrectAnswers(Long userId, Long contestId);
    
    /**
     * 计算竞赛的答题统计
     *
     * @param contestId 竞赛ID
     * @return 是否成功
     */
    boolean calculateContestStatistics(Long contestId);
} 